package day02;

public class Code02_RandToRand {

    // 此函数只能用，不能修改
    // 等概率返回1~5
    public static int f() {
        return (int) (Math.random() * 5) + 1;
    }

    // 等概率得到0和1
    public static int a() {
        int ans = 0;
        do {
            ans = f();
        } while (ans == 3);
        return ans < 3 ? 0 : 1;
    }

    // 等概率返回0~6
    public static int b() {
        int ans = 0;
        do {
            ans = (a() << 2) + (a() << 1) + a();
        } while (ans == 7);
        return ans;
    }

    // 等概率返回1~7
    public static int c() {
        return b() + 1;
    }


	// 你只能知道，x会以固定概率返回0和1
	public static int x() {
		return Math.random() < 0.84 ? 0 : 1;
	}

	// 等概率返回0和1
	public static int y() {
		int ans = 0;
		do {
			ans = x();
		} while (ans == x());
		return ans;
	}

	// 返回[0,1)的一个小数 概率为 1-（1-x）^2
	public static double xToXMin() {
		return Math.min(Math.random(), Math.random());
	}

	// 返回[0,1)的一个小数 概率为 x^2
	public static double xToXMax() {
		return Math.max(Math.random(), Math.random());
	}

    public static void main(String[] args) {
        System.out.println("测试开始");
        // Math.random() -> double -> [0,1)
        int testTimes = 10000000;
        int count = 0;

        double x = 0.17;
        for (int i = 0; i < testTimes; i++) {
            if (xToXMax() < x) {
                count++;
            }
        }
        System.out.println((double) count / (double) testTimes);
        System.out.println((double) 1 - Math.pow((double) 1 - x, 2));
		System.out.println(Math.pow(x, 2));
    }

}
